﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Net.Mail;
using System.Net;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data;
using System.Text.RegularExpressions;
using System.Collections;
using System.Data.SqlTypes;

namespace Cash
{
    public class BasePageCash : System.Web.UI.Page
    {
        public CashEntities cashEntity = new CashEntities();
        public DateTime MinDataSql = Convert.ToDateTime(SqlDateTime.MinValue.ToString()); //Convert.ToDateTime("1/1/1753 12:00:00");
        public DateTime MaxDataSql = Convert.ToDateTime(SqlDateTime.MaxValue.ToString()); //DateTime.Now;
        public TimeSpan horaCompl = new TimeSpan(23, 59, 59); // hours, minutes, seconds
        public String ErroValidacao = "";

        public DateTime validaDataPesquisa(DateTime data)
        {
            if (data >= Convert.ToDateTime(SqlDateTime.MaxValue.ToString()))
            {
                data = Convert.ToDateTime(SqlDateTime.MaxValue.ToString());
            }
            else if (data <= Convert.ToDateTime(SqlDateTime.MinValue.ToString()))
            {
                data = Convert.ToDateTime(SqlDateTime.MinValue.ToString());
            }
            return data;
        }

        public void erroConexaoBanco()
        {
            Response.Redirect("~/SistemaEmManutencao.aspx");
        }

        public void sendEmail(String email, String nome, String corpoEmail)
        {
            SmtpClient cliente = new SmtpClient("smtp.gmail.com", 587 /* TLS */);
            cliente.EnableSsl = true;

            MailAddress remetente = new MailAddress(
              "thiagocezarsilverio@gmail.com", "Thiago");
            MailAddress destinatario = new MailAddress(
              email, "Fulano");

            MailMessage mensagem = new MailMessage(remetente, destinatario);

            mensagem.Body = "Exemplo de mensagem via GMail";
            mensagem.Subject = "Recuparação de senha Sistema Management Cash.";

            NetworkCredential credenciais = new NetworkCredential(
              "tcsprojeto@gmail.com", /* login */
              "tcsgmail", /* senha */
              "");

            cliente.Credentials = credenciais;
            try
            {
                cliente.Send(mensagem);
                gravaBitacora("Sucesso", "Email Enviado para -> " + email);
            }
            catch (Exception ex)
            {
                gravaBitacora("Erro", "Enviar Email -> " + ex.Message);
                return;
            }
        }

        public string retiraAcento(String str)
        {
            /** Troca os caracteres acentuados por não acentuados **/
            string[] acentos = new string[] { "ç", "Ç", "á", "é", "í", "ó", "ú", "ý", "Á", "É", "Í", "Ó", "Ú", "Ý", "à", "è", "ì", "ò", "ù", "À", "È", "Ì", "Ò", "Ù", "ã", "õ", "ñ", "ä", "ë", "ï", "ö", "ü", "ÿ", "Ä", "Ë", "Ï", "Ö", "Ü", "Ã", "Õ", "Ñ", "â", "ê", "î", "ô", "û", "Â", "Ê", "Î", "Ô", "Û" };
            string[] semAcento = new string[] { "c", "C", "a", "e", "i", "o", "u", "y", "A", "E", "I", "O", "U", "Y", "a", "e", "i", "o", "u", "A", "E", "I", "O", "U", "a", "o", "n", "a", "e", "i", "o", "u", "y", "A", "E", "I", "O", "U", "A", "O", "N", "a", "e", "i", "o", "u", "A", "E", "I", "O", "U" };
            for (int i = 0; i < acentos.Length; i++)
            {
                str = str.Replace(acentos[i], semAcento[i]);
            }
            /** Troca os caracteres especiais da string por "" **/
            string[] caracteresEspeciais = { "\\.", ",", "-", ":", "\\(", "\\)", "ª", "\\|", "\\\\", "°" };
            for (int i = 0; i < caracteresEspeciais.Length; i++)
            {
                str = str.Replace(caracteresEspeciais[i], "");
            }
            /** Troca os espaços no início por "" **/
            str = str.Replace("^\\s+", "");
            /** Troca os espaços no início por "" **/
            str = str.Replace("\\s+$", "");
            /** Troca os espaços duplicados, tabulações e etc por  " " **/
            str = str.Replace("\\s+", " ");
            return str;
        }

        public static void ShowMsg(Enum message)
        {
            BasePageCash basePage = new BasePageCash();
            String text = "teste";
            basePage.ExibeAlerta(message, text);
        }

        public void ExibeAlerta(Enum message, String text)
        {
            String texto;
            Mensagem mens = new Mensagem();

            switch (mens)
            {
                case Mensagem.Personalizado:
                    texto = text;
                    break;
                case Mensagem.ErroGrid:
                    texto = "Erro ao gerar a grid.";
                    break;
                case Mensagem.Excluir:
                    texto = "Registro excluido com sucesso.";
                    break;
                case Mensagem.ErroExcluir:
                    texto = "Erro ao excluir registro.";
                    break;
                case Mensagem.Cadastro:
                    texto = "Cadastro realizado com sucesso.";
                    break;
                case Mensagem.ErroCadastro:
                    texto = "Erro ao realizar o cadastro.";
                    break;
                case Mensagem.Atualizar:
                    texto = "Registro atualizado com sucesso.";
                    break;
                case Mensagem.ErroAtualizar:
                    texto = "Erro ao atualizar registro.";
                    break;
                default:
                    texto = "Ação não definida";
                    break;
            }

            Page.ClientScript.RegisterStartupScript(Page.GetType(), "alerta", "alert('OlÃ¡ Mundo')", true);
        }

        public string quebraDescricao(string descricao)
        {
            string conversao = "";
            int cont = 0;
            List<string> result = descricao.Split(' ').ToList();
            foreach (var item in result)
            {
                conversao += " " + item;
                cont += 1 + item.Count();
                if (cont >= 20)
                {
                    conversao += "<br/>";
                    cont = 0;
                }
            }

            return conversao;
        }

        public String diretorio(String nomeArquivo)
        {
            string savePath = Server.MapPath("~/images/FotoProduto/"); //"c:\\temp\\uploads\\";
            return savePath + nomeArquivo;
        }

        public Boolean SaveFile(HttpPostedFile FileUpload1)
        {
            try
            {
                Boolean status = false;
                string pathToCheck = diretorio(FileUpload1.FileName);

                //Verifica se arquivo já existe
                if (!System.IO.File.Exists(pathToCheck))
                {
                    //Realiza gravacao
                    FileUpload1.SaveAs(pathToCheck);
                    status = true;
                    gravaBitacora("Sucesso", "Salvou arquivo -> " + pathToCheck);
                }
                return status;
            }
            catch (Exception ex)
            {
                gravaBitacora("Erro", "Salvar arquivo -> " + ex.Message);
                return false;
            }
        }

        public class Validacao
        {
            //Retorna se campo e valido ou nao

            public static Boolean Cpf(String cpf)
            {
                int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
                int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
                string tempCpf;
                string digito;
                int soma;
                int resto;
                cpf = cpf.Trim();
                cpf = cpf.Replace(".", "").Replace("-", "");
                if (cpf.Length != 11)
                    return false;
                tempCpf = cpf.Substring(0, 9);
                soma = 0;

                for (int i = 0; i < 9; i++)
                    soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];
                resto = soma % 11;
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;
                digito = resto.ToString();
                tempCpf = tempCpf + digito;
                soma = 0;
                for (int i = 0; i < 10; i++)
                    soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];
                resto = soma % 11;
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;
                digito = digito + resto.ToString();
                return cpf.EndsWith(digito);
            }

            public static Boolean Cnpj(String cnpj)
            {
                int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
                int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
                int soma;
                int resto;
                string digito;
                string tempCnpj;
                cnpj = cnpj.Trim();
                cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");
                if (cnpj.Length != 14)
                    return false;
                tempCnpj = cnpj.Substring(0, 12);
                soma = 0;
                for (int i = 0; i < 12; i++)
                    soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];
                resto = (soma % 11);
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;
                digito = resto.ToString();
                tempCnpj = tempCnpj + digito;
                soma = 0;
                for (int i = 0; i < 13; i++)
                    soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];
                resto = (soma % 11);
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;
                digito = digito + resto.ToString();
                return cnpj.EndsWith(digito);
            }

            public static Boolean Date(String dt)
            {
                DateTime aux;
                Boolean result = false;
                if (DateTime.TryParse(dt.ToString(), out aux) == true)
                    result = true;
                return result;
            }

            public static Boolean Numero(String numero)
            {
                Boolean result = false;
                int i;
                if (int.TryParse(numero, out i))
                {
                    result = true;
                }

                return result;
            }

            //Mensagem de erro

            public static String Numero(String numero, String nomeCampo)
            {
                String result = "";
                Regex rx = new Regex(@"^\d+$");
                if (rx.IsMatch(numero))
                {
                    result = "Campo " + nomeCampo + " não é um número valido.<br/>";
                }
                return result;
            }

            public static String Moeda(String valor, String nomeCampo)
            {
                String result = "";
                double number;

                if (!Double.TryParse(valor, out number))
                    result = "Campo " + nomeCampo + " não é um valor valido.<br/>";
                return result;
            }

            public static String CampoVazio(String text, String nomeCampo)
            {
                String result = "";
                if ("".Equals(text))
                {
                    result = "Campo " + nomeCampo + " deve ser preenchido.<br/>";
                }

                return result;
            }

            public static String SelecioneDropDown(String value, String nomeCampo)
            {
                String result = "";
                if (value == "0")
                {
                    result = "Campo " + nomeCampo + " deve ser selecionado.<br/>";
                }

                return result;
            }

            #region Data

            public static String Data(String dt, String nomeCampo)
            {
                try
                {
                    DateTime aux;
                    String result = "";
                    DateTime dtMax = DateTime.Parse("1/1/1754 12:00:00");
                    if (DateTime.TryParse(dt.ToString(), out aux) == false)
                        result = nomeCampo + " invalida.<br/>";
                    //Valida a data para não dar SqlDateTime overflow       
                    if (aux <= dtMax)
                        result = nomeCampo + " invalida.<br/>";

                    return result;
                }
                catch (Exception)
                {
                    return nomeCampo + " invalida.<br/>";
                }
            }

            public static String DataMenor(String dt, String nomeCampo)
            {
                try
                {
                    DateTime aux;
                    String result = "";
                    DateTime dtMax = DateTime.Parse("1/1/1754 12:00:00");
                    DateTime dataComparacao = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", DateTime.Now));
                    DateTime dataValidar = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", dt));
                    if (DateTime.TryParse(dt.ToString(), out aux) == false)
                        result = nomeCampo + " invalida.<br/>";

                    //Valida a data para não dar SqlDateTime overflow       
                    if (aux <= dtMax)
                        result = nomeCampo + " invalida.<br/>";

                    if (dataValidar < dataComparacao)
                        result = nomeCampo + " menor que o dia atual.<br/>";

                    return result;
                }
                catch (Exception)
                {
                    return nomeCampo + " invalida.<br/>";
                }
            }

            public static String DataIgual(String dt, String nomeCampo)
            {
                try
                {
                    DateTime aux;
                    String result = "";
                    DateTime dtMax = DateTime.Parse("1/1/1754 12:00:00");
                    DateTime dataComparacao = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", DateTime.Now));
                    DateTime dataValidar = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", dt));
                    if (DateTime.TryParse(dt.ToString(), out aux) == false)
                        result = nomeCampo + " invalida.<br/>";
                    //Valida a data para não dar SqlDateTime overflow       
                    if (aux <= dtMax)
                        result = nomeCampo + " invalida.<br/>";

                    if (dataValidar < dataComparacao)
                        result = nomeCampo + " igual que o dia atual.<br/>";

                    return result;
                }
                catch (Exception)
                {
                    return nomeCampo + " invalida.<br/>";
                }
            }

            public static String DataMaior(String dt, String nomeCampo)
            {
                try
                {
                    DateTime aux;
                    String result = "";
                    DateTime dtMax = DateTime.Parse("1/1/1754 12:00:00");
                    DateTime dataComparacao = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", DateTime.Now));
                    DateTime dataValidar = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", dt));
                    if (DateTime.TryParse(dt.ToString(), out aux) == false)
                        result = nomeCampo + " invalida.<br/>";
                    //Valida a data para não dar SqlDateTime overflow       
                    if (aux <= dtMax)
                        result = nomeCampo + " invalida.<br/>";

                    if (dataValidar > dataComparacao)
                        result = nomeCampo + " maior que o dia atual.<br/>";

                    return result;
                }
                catch (Exception)
                {
                    return nomeCampo + " invalida.<br/>";
                }
            }

            public static String DataMenorIgual(String dt, String nomeCampo)
            {
                try
                {
                    DateTime aux;
                    String result = "";
                    DateTime dtMax = DateTime.Parse("1/1/1754 12:00:00");
                    DateTime dataComparacao = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", DateTime.Now));
                    DateTime dataValidar = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", dt));
                    if (DateTime.TryParse(dt.ToString(), out aux) == false)
                        result = nomeCampo + " invalida.<br/>";
                    //Valida a data para não dar SqlDateTime overflow       
                    if (aux <= dtMax)
                        result = nomeCampo + " invalida.<br/>";

                    if (dataValidar <= dataComparacao)
                        result = nomeCampo + " invalida.<br/>";

                    return result;
                }
                catch (Exception)
                {
                    return nomeCampo + " invalida.<br/>";
                }
            }

            public static String DataMaiorIgual(String dt, String nomeCampo)
            {
                try
                {
                    DateTime aux;
                    String result = "";
                    DateTime dtMax = DateTime.Parse("1/1/1754 12:00:00");
                    DateTime dataComparacao = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", DateTime.Now));
                    DateTime dataValidar = Convert.ToDateTime(String.Format("{0:dd/MM/yyyy}", dt));
                    if (DateTime.TryParse(dt.ToString(), out aux) == false)
                        result = nomeCampo + " invalida.<br/>";
                    //Valida a data para não dar SqlDateTime overflow       
                    if (aux <= dtMax)
                        result = nomeCampo + " invalida.<br/>";

                    if (dataValidar >= dataComparacao)
                        result = nomeCampo + " invalida.<br/>";

                    return result;
                }
                catch (Exception)
                {
                    return nomeCampo + " invalida.<br/>";
                }
            }

            #endregion

            public static String CodBarras(String cod)
            {
                String result = "";
                if (!Validacao.Numero(cod))
                {
                    result += "Codigo de barras invalido.<br/>";
                }
                return result;
            }

            public static String ValidaArquivo(HttpPostedFile FileUpload1)
            {
                string status = "";

                //Valida Arquivo
                string name = FileUpload1.FileName; //Nome
                if (!"".Equals(name))
                {
                    int size = FileUpload1.ContentLength; //Tamanho
                    string format = FileUpload1.ContentType; //Tipo
                    List<string> formatoPermitido = new List<string> { "image/jpeg", "image/png", "image/gif" };

                    if (!formatoPermitido.Contains(format))
                    {
                        status = "Formato de arquivo invalido.";
                    }
                }
                return status;
            }
        }

        public class GridViewExportUtil
        {

            public static void Export(string fileName, GridView gv)
            {
                BasePageCash basePage = new BasePageCash();
                try
                {
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.AddHeader(
                        "content-disposition", string.Format("attachment; filename={0}", fileName));

                    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    //HttpContext.Current.Response.ContentType = "application/ms-excel";

                    using (StringWriter sw = new StringWriter())
                    {
                        using (HtmlTextWriter htw = new HtmlTextWriter(sw))
                        {
                            //  Create a form to contain the grid
                            Table table = new Table();

                            //  add the header row to the table
                            if (gv.HeaderRow != null)
                            {
                                GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                                table.Rows.Add(gv.HeaderRow);
                            }

                            //  add each of the data rows to the table
                            foreach (GridViewRow row in gv.Rows)
                            {
                                GridViewExportUtil.PrepareControlForExport(row);
                                table.Rows.Add(row);
                            }

                            //  add the footer row to the table
                            if (gv.FooterRow != null)
                            {
                                GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                                table.Rows.Add(gv.FooterRow);
                            }

                            //  render the table into the htmlwriter
                            table.RenderControl(htw);

                            //  render the htmlwriter into the response
                            HttpContext.Current.Response.Write(sw.ToString());
                            HttpContext.Current.Response.End();
                        }
                    }
                    basePage.gravaBitacora("Erro", "Exportou arquivo -> " + fileName);
                }
                catch (Exception ex)
                {
                    basePage.gravaBitacora("Erro", "Exportar arquivo -> " + ex.Message);
                }
            }

            /// <summary>
            /// Replace any of the contained controls with literals
            /// </summary>
            /// <param name="control"></param>
            private static void PrepareControlForExport(Control control)
            {
                for (int i = 0; i < control.Controls.Count; i++)
                {
                    Control current = control.Controls[i];
                    if (current is LinkButton)
                    {
                        control.Controls.Remove(current);
                        control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
                    }
                    else if (current is ImageButton)
                    {
                        control.Controls.Remove(current);
                        control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
                    }
                    else if (current is HyperLink)
                    {
                        control.Controls.Remove(current);
                        control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
                    }
                    else if (current is DropDownList)
                    {
                        control.Controls.Remove(current);
                        control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
                    }
                    else if (current is CheckBox)
                    {
                        control.Controls.Remove(current);
                        control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
                    }

                    if (current.HasControls())
                    {
                        GridViewExportUtil.PrepareControlForExport(current);
                    }
                }
            }
        }

        public enum Mensagem
        {
            Personalizado = 1,
            ErroGrid,
            Excluir,
            ErroExcluir,
            Cadastro,
            ErroCadastro,
            Atualizar,
            ErroAtualizar,

        };

        public void gravaBitacora(String acao, String script, int validar = 0)
        {
            try
            {
                if (validar > 0) {
                    acao = "".Equals(acao) ? "Cadastro" : "Atualizado";
                }

                PAGINA pagina = new PAGINA();
                USUARIO usuario = new USUARIO();
                String strPaginaAtual = Request.CurrentExecutionFilePath;
                String strValidaPaginaAtual = strPaginaAtual.Remove(0, strPaginaAtual.LastIndexOf("/") + 1);
                pagina = cashEntity.PAGINA.Where(pag => pag.URL == strValidaPaginaAtual).First();

                String sessioUser = Session["username"] == null ? "ADMIN" : Session["username"].ToString();
                usuario = cashEntity.USUARIO.Where(usu => usu.USUARIO1 == sessioUser).First();

                BITACORA bitacora = new BITACORA();

                bitacora.ACAO = acao;
                bitacora.DATA_CADASTRO = DateTime.Now;
                bitacora.ID_PAGINA = pagina.ID_PAGINA;
                bitacora.ID_USUARIO = usuario.ID_USUARIO;
                bitacora.SCRIPT = script;

                cashEntity.AddToBITACORA(bitacora);
                cashEntity.SaveChanges();
            }
            catch (Exception)
            {
            }
        }
    }
}